[SAP ABAP开发技术总结]列表屏幕

 

13.         列表屏幕

START/END-OF-SELECTION事件处理块中,用WRITE语句向列表缓冲区(List Buffer)输出要显示的内容,当该事件结束的时候,所有在列表缓冲区中的内容将被显示到一个基本列表屏幕Basic List)上

当用户在基础列表屏幕上双击一行或按功能键“F2”时,将会触发ABAP事件AT LINE-SELECTION,如果还想进一步显示该行数据的详细信息,则可以继续使用WRITE语句输出要显示的内容,这次生成另外一个详细列表屏幕Details List Screen)。此详细列表屏幕将覆盖其上一层的基础列表屏幕,若在其界面的工具条上点“返回”或按功能键F3,将返回到基础列表屏幕。

在详细列表屏幕上,当用户双击一行数据或按功能键F2AT LINE-SELECTION事件将会再次触发,因此还可以继续生成下一级的详细列表屏幕

ABAP提供了全屏变量sy-lsind来区别屏幕的层次,sy-lsind的值主要用于在 AT LINE-SELECTION事件处理块中进行程序流程控。0表示为基础列表屏幕,1表示第一级详细列表屏幕,依次类推,最多可以有20个详细列表

13.1.     标准LIST

image131

至少包括二行standard header,第一行standard header包括了listheaderpagenumber,第二行standard header是一条水平线。当程序是可执行报表程序时,listheader存储在SY-TITLE中。如果有必要,可以给standardheader添加最多四行的columnheaders与一条水平线。在水平或垂直滚动时standardheader是不会动的。

image132

13.2.     自定义LIST

TOP-OF-PAGE.

REPORT <rep> NO STANDARD PAGE HEADING.

REPORT <rep> LINE-SIZE <width>            当前页面宽度存储在SY-LINSZ系统变量中

REPORT <rep> LINE-COUNT <length>[(<n>)]   如果指定了<n>参数,系统会保留<n>行给page footer页面的实际可输出正本行数为<length>减去page header length,再减去<n>。每页的行数包含了列表头(headings)、列表内容与列表脚注行(footer lines);系统变量SY-LINCT会存储页面行数<length>,注意:如果REPORT语句没有设置该值,则该系统变量值为0,除非使用NEW-PAGE语句进行了设置。

SY-PAGNO系统变量存储了当前页码

END-OF-PAGE.                              触发的条件是数据要满一页时才触发,否则不会被触发
NEW-PAGE

RESERVE <n> LINES                         在调用此语句时,如果最后一次输出到Page Footer之间所剩行小于(注意:等于时不会分页)<n>时会进行分页,在开始新页之前会触发END-OF-PAGE事件(如果最后一页数据不足一页,还是不会显示页脚)

NEW-PAGE [NO-TITLE|WITH-TITLE] [NO-HEADING|WITH-HEADING] WITH-TITLENO-TITLE:控制NEW-PAGE新开启的页面以及后面使用NEW-PAGE开启的页面是否使用标准的list header

NO-HEADINGWITH-HEADING:控制NEW-PAGE新开启的页面以及后面使用NEW-PAGE开启的页面是否使用标准的column header

NEW-PAGE LINE-COUNT <length>       系统变量SY-LINCT会存储页面行数(即<length>)。该选项决定了随后的所有(除非又重新通过该语句的这个选项重新指定了)使用NEW-PAGE语句分出的页面的允许的最大数据行数

NEW-PAGE LINE-SIZE <width>         SY-SCOLS:存储了当前窗口在没有滚动条的情况下允许的最大字符数(或叫Column),而LINE-SIZE选项指的是列表本身最大允许的字符数,与窗口大小没有关系(如果LIST列表的宽度LINE-SIZE大于了窗口允许的最大字符数SY-SCOLS,则会出现滚动条,否则窗口不会出现滚动条)

13.3.     LIST事件

AT PF<nn>(obsolete)已过时

键盘上的F<nn>01 24)键不再具有系统预置功能,它们都将与function codes PF<nn>关联

AT LINE-SELECTION

当用户在LIST屏幕上的某行上按F2或者鼠标双击时,就会触发该事件块,并且此时的function code默认名为PICK

AT USER-COMMAND

除上面PF<nn>PICK两个Function code以外,其他的function codes将被runtime environment(预置按钮的FunCode会被运行时环境捕获)拦截或者是触发AT USER-COMMAND事件。

 

除了通过手动触发LIST屏幕事件之外,还可以直接通过编程的方式来触发:

SET USER-COMMAND <fc>.

该语句会在当前列表事件块里的所有输出结束后生效(这意味着该语句放在输出语句的前后都没有关系),并在列表显示之前触发与<fc>对应的事件。其作用与用户手动选择了相应的Function Code是一样的

13.4.     Detail Lists 创建

凡事在AT PF<nn>AT LINE-SELECTIONAT USER-COMMAND三个事件块里输出的内容,都会创建一个新的detail lists

13.5.      标准的 List Status

如果在报表程序中没有设置(Basic ListDetail List都未设置时)GUI status,则系统会将list screenStatus设置为系统内置的default list status;在其他类型的程序中(如当你在Screen中创建一个list时),你可以明确的调用下面语句来设置成系统内置的default list status

SET PF-STATUS space.

该语句定义了Standard List所拥有的默认functions,系统所提供的内置default list status如下(这些功能都已实现,可直接使用):

image133

13.6.     列表屏幕上的数据与程序间的传递

13.6.1.           SY-LISEL

SY-LISEL类型为C(255),它是将整行的内容都存储下来了,所以要取得每个Field,则需要通过offset方式来截取

13.6.2.           HIDE

HIDE <f>.

变量<f>可以是整行或部分输出列的变量,甚至是其他与行内容无关的变量。

当单击List屏幕中的行时,如果对应的行设置了隐藏字段,则HIDE隐藏字段变量<f>会自动被存储值填充,当然也可以使用READ LINE来手动控制读取填充隐藏域

注:局部变量不能存储到HIDE区域中

语句要在数据行被WRITE语句输出到列表缓冲区后,在后面紧着编写(为了隐藏的数据与当前输入的数据一致),并且当被双击时保存在隐藏域中的字段的值将自动被传回到原始字段中

隐藏域实质上是一个内表其行结构包含了三个字段:被选中行的行号、字段名、字段值,当保存数据时,每个被保存的字段在隐藏域中形成一行:

image134

上图中已将wa_spfli-carridwa_spfli-connid存入了隐藏域中了,所以在双击行后,可以直接使用AT LINE-SELECTION.事件中使用

13.6.3.           READ LINE

READ LINE <lin> [INDEX <idx>]
      [
FIELD VALUE <f1>[
INTO
 <g1>]...<fn>[INTO <gn>]] [OF CURRENT PAGE|OF PAGE <p>].

该语句会将事件触发所在的List(index SY-LILLI))中的第<lin>行的内容存储到SY-LISEL系统变量中,并且随之将<lin>行所对应的HIDE字段也进行相应填充。另外会将Write显示输出的名为<fn>字段的值存储到<gn>全局变量中

13.7.     Screen Processing 屏幕处理切换到Lists列表输出

为了将dialog processor控制权转交给list processor,你可在PBO dialog modules 中调用下面这样的语句:

LEAVE TO LIST-PROCESSING[AND RETURN TO SCREEN<nnnn>]

该语句可以使用在PBO 或者PAI event中,它的作用是在当前屏幕的PAI processing(一般在PBO块里使用SUPPRESS DIALOG.LEAVE SCREEN.语句后不会显示这个屏幕,此时在PBO事件块结束后立即显示Basic List)结束后开始list processor并显示Basic List。调用该语句所在屏幕的PBO and PAI modules中的list output都会被输出到Basic List中缓存起来,待该屏幕处理完后显示(如果没有在PBO中使用SUPPRESS DIALOG.LEAVE SCREEN.语句,则在PAI结束后显示;如果使用了这两个语句,则会在PBO块结束后就会显示)

 

可以使用以下两种方式来离开list processing

?    basiclist中点击Back,Exit,orCancel

?    list processing程序中使用:LEAVE LIST-PROCESSING.

以上两种方式都会使控制权从list processor转交到dialog processor

 

在默认的情况下,不带AND RETURN TO SCREEN选项的LEAVE TO LIST-PROCESSING语句在当list processor 处理结束后(如关闭list列表输出窗体时),dialog processor将会又会返回到LEAVE TO LIST-PROCESSING语句调用所在屏幕的PBO事件块,并重新执行PBO事件块(所以这样使用会出现死循环:关不掉List列表输出窗口);选项AND RETURN TO SCREEN允许你指定当前屏幕序列(即LEAVE TO LIST-PROCESSING语句调用所在屏幕所在的屏幕序列)中的某个屏幕,当list processor 处理结束后,dialog processor将会回到指定的屏幕并执行其相应的PBO事件块

13.8.     LIST 打印输出

打印参数设置:

SET_PRINT_PARAMETERS

GET_PRINT_PARAMETERS

 

从程序中启动打印:NEW-PAGEPRINTON

posted @ 2015-02-01 13:26  江正军  阅读(2988)  评论(0编辑  收藏  举报